<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="M_data" style="display: none;">
        [{"deviceType":"5","orgName":"上虞健康小屋"}, {"deviceType":"9","orgName":"东阳人民医院"},
        {"deviceType":"8","orgName":"睡眠仪ToB"}, {"deviceType":"8","orgName":"睡眠仪ToB"}]
    </div>
    <div class="myBox" style="background:orange"></div>
    <div class="myBox" style="background:orange"></div>
    <div class="myBox" style="background:orange"></div>
    <div class="myBox" style="background:orange"></div>
    <script>
        var data = JSON.parse(document.getElementById('M_data').innerHTML)
        var myBox = document.getElementsByClassName('myBox')

        // 第二个参数用来改变遍历函数内this指向(前提是不能用箭头函数)
        // data.forEach(function(item, index, array) {
        //     console.log(index);
        //     console.log(this)
        // }, {
        //     'a': 111
        // })

        // // 自己写forEach
        // Array.prototype.myforEach = function(fn) {
        //     var arr = this,
        //         len = arr.length,
        //         arg2 = arguments[1] || window;
        //     for (let i = 0; i < len; i++) {
        //         fn.apply(arg2, [arr[i], i, arr])
        //     }
        // }
        // data.myforEach(function(item, index, arr) {
        //     console.log(this)
        //     this[index].innerHTML = item.orgName
        // }, myBox)


        // let fData = data.filter(i => i.deviceType == 8)
        // console.log(fData)


        // // 自己写filter
        // Array.prototype.myfilter = function (fn) {
        //     let arr = this,
        //         len = arr.length,
        //         arg2 = arguments[1] || window,
        //         arr2 = []
        //     for (var i = 0; i < len; i++) {
        //         fn.apply(arg2, [arr[i]]) ? arr2.push(i) : ''
        //     }
        //     return arr2
        // }
        // let mfData = data.myfilter(i => i.deviceType == 8)
        // console.log(fData)

        //自己实现map

        // let MData = data.map((item, index, array) => {
        //     item.deviceType += '我是一个程序员'
        //     return item;
        // })
        // console.log(MData)


        // Array.prototype.Mymap = function (fn) {
        //     let arr = this,
        //         len = arr.length,
        //         arg = arguments[1] | window,
        //         arr2 = [];
        //     for (var i = 0; i < len; i++) {
        //         let newArr = JSON.parse(JSON.stringify(arr[i]))
        //         arr2.push(fn.apply(arg, [newArr, i, arr]))
        //     }
        //     return arr2
        // }
        // let MyData = data.Mymap((item, index, array) => {
        //     item.deviceType += '我是一个程序员'
        //     return item;
        // })
        // console.log(MyData)
        // console.log(data)

        // 有一个不满足条件，返回false并停止循环
        // let res = data.every(function (elem, index, array) {
        //     console.log(elem)
        //     return elem.deviceType == '5'
        // })
        // console.log(res)

        // Array.prototype.myEvery = function (fn) {
        //     let arr = this,
        //         len = arr.length,
        //         arg = arguments[1] || window,
        //         bool = true;

        //     for (var i = 0; i < len; i++) {
        //         if (!fn.apply(arg, [arr[i], i, arr])) {
        //             bool = false;
        //             break;
        //         }
        //     }
        //     return bool
        // }
        // let myRes = data.myEvery(function (elem, index, array) {
        //     console.log(elem)
        //     return elem.deviceType == '5'
        // })
        // console.log(myRes)


        // 只要有一个满足条件，就返回true并停止循环
        // let res2 = data.some(function (elem, index, array) {
        //     console.log(elem)
        //     return elem.deviceType == '8'
        // })
        // console.log(res2)

        // Array.prototype.mySome = function (fn) {
        //     let arr = this,
        //         len = arr.length,
        //         arg = arguments[1] || window,
        //         bool = false
        //     for (var i = 0; i < len; i++) {
        //         if (fn.apply(arg, [arr[i], i, arr])) {
        //             bool = true;
        //             break;
        //         }
        //     }
        //     return bool;
        // }

        // let myres2 = data.mySome(function (elem, index, array) {
        //     return elem.deviceType == this.deviceType
        // }, { deviceType: '8' })
        // console.log(myres2)

        // let sum = data.reduce(function (initSum, elem, index, array) {
        //     initSum.push(Number(elem.deviceType))
        //     console.log(this)
        //     return initSum
        // }, [])
        // console.log(sum)

        // Array.prototype.myReduce = function (fn, init) {
        //     let arr = this,
        //         len = arr.length,
        //         newInit = init;
        //     for (let i = 0; i < len; i++) {
        //         newInit = fn(newInit, arr[i], i, arr)
        //     }
        //     return newInit
        // }
        // let mySum = data.myReduce(function (initSum, elem, index, array) {
        //     initSum.push(Number(elem.deviceType))
        //     return initSum
        // }, [])
        // console.log(mySum)

        let sum = data.reduceRight(function (initSum, elem, index, array) {
            initSum.push(Number(elem.deviceType))
            return initSum
        }, [])
        console.log(sum)
        Array.prototype.myReduceRight = function (fn, init) {
            let arr = this,
                len = arr.length,
                newInit = init;
            for (let i = len - 1; i >= 0; i--) {
                newInit = fn(newInit, arr[i], i, arr)
            }
            return newInit
        }
        let mySum = data.myReduceRight(function (initSum, elem, index, array) {
            initSum.push(Number(elem.deviceType))
            return initSum
        }, [])
        console.log(mySum)
    </script>
</body>

</html>